package com.atguigu.nio;

import java.io.IOException;
import java.io.RandomAccessFile;
import java.nio.MappedByteBuffer;
import java.nio.channels.FileChannel;

/**
 * @author: 叶子
 * @date: 2022/01/17 20:46
 * 演示MappedByteBuffer，可以让文件直接在内存（堆外的内存）中进行修改
 * 而如何同步到文件由NIO来完成
 * 1.MapperByteBuffer 可以让文件直接在堆外内存修改，操作系统不需要拷贝一次
 **/
public class MappedByteBufferTest {
    public static void main(String[] args) throws IOException {
        RandomAccessFile randomAccessFile = new RandomAccessFile("1.txt", "rw");
//        获取对应的通道
        FileChannel channel = randomAccessFile.getChannel();
        /**
         * 参数1：FileChannel.MapMode.READ_WRITE 使用的是读写模式
         * 参数2：0 代表可以直接修改的起始位置
         * 参数3：5 代表映射到内存的大小(不是索引)，即 将1.txt的多少个字节映射到内存
         * 可以直接修改的范围就是0-5(不包含索引5)
         * 实际类型是DirectByteBuffer
         */
        MappedByteBuffer mappedByteBuffer = channel.map(FileChannel.MapMode.READ_WRITE, 0, 5);
        mappedByteBuffer.put(0, (byte) 'H');
        mappedByteBuffer.put(3, (byte) '9');
        //mappedByteBuffer.put(5, (byte) 'Y');//抛出java.lang.IndexOutOfBoundsException
        // 证明是0是起始位置5是大小,此处最大能修改索引为4的数据
        randomAccessFile.close();
        System.out.println("修改成功");
    }
}